import java.sql.*;

/**
 * MySQL 8 JDBC工具类（无配置文件、无连接池）
 * 连接参数直接在代码中定义，适合简单场景
 */
public class DBUtils {
    // 数据库连接参数（直接硬编码，根据实际环境修改）
    private static final String DRIVER = "com.mysql.cj.jdbc.Driver";
    private static final String URL = "jdbc:mysql://192.168.232.4:12581/rj1?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true";
    private static final String USERNAME = "";  // 数据库用户名
    private static final String PASSWORD = "";  // 数据库密码

    // 静态代码块：加载驱动
    static {
        try {
            // 加载MySQL 8驱动（必须使用cj包下的驱动）
            Class.forName(DRIVER);
            System.out.println("MySQL 8驱动加载成功");
        } catch (ClassNotFoundException e) {
            throw new RuntimeException("驱动加载失败，请检查驱动是否正确添加", e);
        }
    }

    /**
     * 获取数据库连接
     * @return 数据库连接对象
     * @throws SQLException 连接失败时抛出异常
     */
    public static Connection getConnection() throws SQLException {
        return DriverManager.getConnection(URL, USERNAME, PASSWORD);
    }

    /**
     * 关闭资源（连接、语句、结果集）
     */
    public static void close(Connection conn, Statement stmt, ResultSet rs) {
        // 关闭结果集
        if (rs != null) {
            try {
                rs.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        // 关闭语句对象
        if (stmt != null) {
            try {
                stmt.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        // 关闭连接
        if (conn != null) {
            try {
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }

    /**
     * 执行增删改操作（INSERT/UPDATE/DELETE）
     * @param sql SQL语句
     * @param params SQL参数（按顺序传入）
     * @return 影响的行数
     * @throws SQLException SQL执行异常
     */
    public static int executeUpdate(String sql, Object... params) throws SQLException {
        Connection conn = null;
        PreparedStatement pstmt = null;
        try {
            conn = getConnection();
            pstmt = conn.prepareStatement(sql);

            // 设置参数（索引从1开始）
            if (params != null && params.length > 0) {
                for (int i = 0; i < params.length; i++) {
                    pstmt.setObject(i + 1, params[i]);
                }
            }

            return pstmt.executeUpdate();
        } finally {
            close(conn, pstmt, null);
        }
    }

    /**
     * 执行查询操作（SELECT），通过回调处理结果集
     * @param sql SQL语句
     * @param callback 结果集处理回调
     * @param params SQL参数
     * @param <T> 结果类型
     * @return 查询结果
     * @throws SQLException SQL执行异常
     */
    public static <T> T executeQuery(String sql, ResultSetHandler<T> callback, Object... params) throws SQLException {
        Connection conn = null;
        PreparedStatement pstmt = null;
        ResultSet rs = null;
        try {
            conn = getConnection();
            pstmt = conn.prepareStatement(sql);

            // 设置参数
            if (params != null && params.length > 0) {
                for (int i = 0; i < params.length; i++) {
                    pstmt.setObject(i + 1, params[i]);
                }
            }

            rs = pstmt.executeQuery();
            return callback.handle(rs);
        } finally {
            close(conn, pstmt, rs);
        }
    }

    /**
     * 结果集处理接口（自定义结果解析逻辑）
     */
    @FunctionalInterface
    public interface ResultSetHandler<T> {
        T handle(ResultSet rs) throws SQLException;
    }
}